﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	СписокВыбора = Элементы.ВариантУстановки.СписокВыбора;
	СписокВыбора.Очистить();
	
	Если Не ЗначениеЗаполнено(Параметры.ВариантыУстановки) Тогда
		ВариантыУстановки = ВариантыУстановкиСертификата();
		Для Каждого ТекущийВариантУстановки Из ВариантыУстановки Цикл
			СписокВыбора.Добавить(ТекущийВариантУстановки.Значение, ТекущийВариантУстановки.Представление);
		КонецЦикла;
	ИначеЕсли Параметры.ВариантыУстановки = "Контейнер" Тогда
		СписокВыбора.Добавить("Контейнер", НСтр("ru = 'Контейнер и личное хранилище'"));
	ИначеЕсли ТипЗнч(Параметры.ВариантыУстановки) = Тип("Строка") Тогда
		СписокВыбора.Добавить(Параметры.ВариантыУстановки);
	Иначе
		Для Каждого ТекущийВариантУстановки Из Параметры.ВариантыУстановки Цикл
			СписокВыбора.Добавить(ТекущийВариантУстановки.Значение, ТекущийВариантУстановки.Представление);
		КонецЦикла;
	КонецЕсли;
	
	ВариантУстановки = СписокВыбора[0].Значение;
	
	СертификатДвоичныеДанные = Неопределено;
	Если ЭтоАдресВременногоХранилища(Параметры.Сертификат) Тогда
		СертификатДвоичныеДанные = ПолучитьИзВременногоХранилища(Параметры.Сертификат);
	ИначеЕсли ЗначениеЗаполнено(Параметры.Сертификат) Тогда
		СертификатДвоичныеДанные = Base64Значение(Параметры.Сертификат);
	КонецЕсли;
	
	Если СертификатДвоичныеДанные <> Неопределено Тогда
		СвойстваСертификата = ЭлектроннаяПодпись.СвойстваСертификата(
			Новый СертификатКриптографии(СертификатДвоичныеДанные));
		ЭлектроннаяПодписьСлужебныйКлиентСервер.ЗаполнитьОписаниеДанныхСертификата(
			СертификатОписаниеДанных, СвойстваСертификата);
	КонецЕсли;
	
	Элементы.ДекорацияТекущийКонтейнер.Видимость = Ложь;

КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	ВариантУстановкиПриИзменении(Неопределено);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ВариантУстановкиПриИзменении(Элемент)
	
	Если ВариантУстановки = "Контейнер" Тогда
		Элементы.ГруппаКонтейнеры.Видимость = Истина;
		Элементы.КонтейнерыОбновить.Видимость = Истина;
		Если Контейнеры.Количество() = 0 Тогда
			ПодключитьОбработчикОжидания("НайтиКонтейнеры", 0.1, Истина);
		КонецЕсли;
	Иначе
		Элементы.ГруппаКонтейнеры.Видимость = Ложь;
		Элементы.КонтейнерыОбновить.Видимость = Ложь;
	КонецЕсли;
	
	Элементы.ДекорацияПредупреждение.Видимость = ВРег(ВариантУстановки) = "ROOT";
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура Обновить(Команда)
	
	ПодключитьОбработчикОжидания("НайтиКонтейнеры", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура Установить(Команда)
	
	ПараметрыУстановкиСертификата = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыУстановкиСертификата(Параметры.Сертификат);
	ПараметрыУстановкиСертификата.Форма = ЭтотОбъект;
	ПараметрыУстановкиСертификата.ОповещениеОЗавершении = Новый ОписаниеОповещения("ПослеУстановкиСертификата", ЭтотОбъект, ПараметрыУстановкиСертификата);
	
	Если ВариантУстановки = "Контейнер" Тогда
		
		ТекущиеДанные = Элементы.Контейнеры.ТекущиеДанные;
		Если ТекущиеДанные = Неопределено Тогда
			ПоказатьПредупреждение(, НСтр("ru = 'Выберите контейнер'"));
			Возврат;
		КонецЕсли;
		
		СвойстваКонтейнера = ЭлектроннаяПодписьСлужебныйКлиент.НовыеСвойстваКонтейнера();
		ЗаполнитьЗначенияСвойств(СвойстваКонтейнера, ТекущиеДанные);
		ПараметрыУстановкиСертификата.СвойстваКонтейнера = СвойстваКонтейнера;
		ПараметрыУстановкиСертификата.Хранилище = НСтр("ru = 'контейнер'");
		
	Иначе
		
		ЭлементСписка = Элементы.ВариантУстановки.СписокВыбора.НайтиПоЗначению(ВариантУстановки);
		ПараметрыУстановкиСертификата.Хранилище = Новый Структура("Значение, Представление", ВариантУстановки, ЭлементСписка.Представление);
		
	КонецЕсли;
	
	ЭлектроннаяПодписьСлужебныйКлиент.УстановитьСертификатПослеВыбораВариантаУстановки(ПараметрыУстановкиСертификата);
	
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьДанныеСертификата(Команда)
	
	ЭлектроннаяПодписьКлиент.ОткрытьСертификат(Параметры.Сертификат, Истина);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиенте
Процедура ПослеУстановкиСертификата(Результат, Контекст) Экспорт
	
	Если Результат.УстановкаВыполнена = Истина Тогда
		Закрыть(Результат);
	Иначе
		ПараметрыФормы = Новый Структура;
		ПараметрыФормы.Вставить("ЗаголовокПредупреждения", НСтр("ru = 'Не удалось установить сертификат.'"));
		ПараметрыФормы.Вставить("ТекстОшибкиКлиент", Результат.Сообщение);
		
		ОткрытьФорму("ОбщаяФорма.РасширенноеПредставлениеОшибки",
			ПараметрыФормы, Контекст.Форма,,,,, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Асинх Процедура НайтиКонтейнеры()
	
	Элементы.ГруппаКонтейнеры.ТекущаяСтраница = Элементы.ОбновлениеТаблицы;
	Контейнеры.Очистить();
	Элементы.ДекорацияТекущийКонтейнер.Видимость = Ложь;
	Элементы.ДекорацияТекущийКонтейнер.Заголовок= "";
	
	КонтейнерыПоСертификату = Ждать ЭлектроннаяПодписьСлужебныйКлиент.КонтейнерыПоСертификату(
		Параметры.Сертификат); // Массив из см. ЭлектроннаяПодписьСлужебныйКлиент.НовыеСвойстваКонтейнера
	
	Для Каждого Контейнер Из КонтейнерыПоСертификату Цикл 
		НоваяСтрока = Контейнеры.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, Контейнер);
		НоваяСтрока.Считыватель = Считыватель(Контейнер.Имя);
		Если Контейнер.ЭтоТекущийКонтейнер = Истина Тогда
			Элементы.ДекорацияТекущийКонтейнер.Видимость = Истина;
			Элементы.ДекорацияТекущийКонтейнер.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Сертификат установлен в контейнер: %1'"), Контейнер.Имя);
		КонецЕсли;
	КонецЦикла;
	
	Элементы.ГруппаКонтейнеры.ТекущаяСтраница = Элементы.ТаблицаКонтейнеры;
	Если КонтейнерыПоСертификату.Количество() = 0 Тогда
		Элементы.ДекорацияТекущийКонтейнер.Заголовок = НСтр("ru = 'Не найдено подходящих контейнеров для установки сертификата'");
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Функция Считыватель(Знач ИмяКонтейнера)
	
	ИмяКонтейнера = ВРег(ИмяКонтейнера);
	
	Если СтрНачинаетсяС(ИмяКонтейнера, "\\.\REGISTRY") Тогда
		Возврат НСтр("ru = 'Реестр'");
	КонецЕсли;

	Если СтрНачинаетсяС(ИмяКонтейнера, "\\.\FAT12") Тогда
		Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( 
			НСтр("ru = 'Диск %1'"), Сред(ИмяКонтейнера, 11, 1));
	КонецЕсли;
	
	Если СтрНачинаетсяС(ИмяКонтейнера, "\\.\HDIMAGE") Тогда
		Возврат НСтр("ru = 'Диск'");
	КонецЕсли;
	
	Возврат "";
	
КонецФункции

&НаСервере
Функция ВариантыУстановкиСертификата()
	
	СписокЗначений = Новый СписокЗначений;
	СписокЗначений.Добавить("MY", НСтр("ru = 'Личное хранилище сертификатов'"));
	СписокЗначений.Добавить("CA", НСтр("ru = 'Промежуточные сертификаты'"));
	СписокЗначений.Добавить("ROOT", НСтр("ru = 'Доверенные корневые сертификаты'"));
	СписокЗначений.Добавить("Контейнер", НСтр("ru = 'Контейнер и личное хранилище'"));
	Возврат СписокЗначений;
	
КонецФункции

#КонецОбласти
